home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack2-4.sfx / hack.4
Text File  |  1990-02-12  |  17KB  |  515 lines

  1. .%0860!  FETCHLINE = *
  2. .%0861!     STA ZW1
  3. .%0862!     STY ZW1+1
  4. .%0863!     LDX #2
  5. .%0864!  -  LDA SORT╨,X
  6. .%0865!     STA ZP1,X
  7. .%0866!     DEX
  8. .%0867!     BPL -
  9. .%0868!     LDX #HEADER
  10. .%0869!     LDY #4
  11. .%0870!     JSR ZPLOAD
  12. .%0871!     LDA HEADER+3
  13. .%0872!     LDY #0
  14. .%0873!     JMP FETCH
  15. .%0874!
  16. .%0875!  ;*** SORT╟╘CMP( SORTLINE, CMPLINE ) : .├╙=█SORTLINE >= CMPLINE▌
  17. .%0876!
  18.  
  19. ╘HIS ROUTINE COMPARES THE LINES STORED IN THE "SORTLINE" AND "CMPLINE" BUFFERS
  20. AND RETURNS WITH CARRY SET IF THE "SORTLINE" IS LARGER (ALPHABETICALLY).  ╔T
  21. ALSO TAKES INTO ACCOUNT THE STARTING COMPARISON POSITIONS AND HANDLES THE CASE
  22. OF EITHER OR BOTH LINES NOT BEING AS LONG AS THE START POSITION OF THE STRING
  23. COMPARISON.
  24.  
  25. .%0877!  SORT╟╘CMP = *
  26.  
  27. ╘HIS SECTION OF CODE MAKES BIT0 OF .╪ A "1" IF SORTLINE IS NOT LONG ENOUGH TO
  28. BE COMPARED, AND MAKES BIT1 A "1" IF CMPLINE IS TOO SHORT.
  29.  
  30. .%0878!     LDX #0
  31. .%0879!     CLC
  32. .%0880!     LDA SORT├OLUMN
  33. .%0881!     ADC #5
  34. .%0882!     CMP SORTBUFLEN
  35. .%0883!     BCC +
  36. .%0884!     INX
  37. .%0885!  +  CMP CMPBUFLEN
  38. .%0886!     BCC +
  39. .%0887!     INX
  40. .%0888!     INX
  41.  
  42. ┴ND HERE IS WHERE IT TAKES ACTION DEPENDING WHETHER THE LINES ARE LARGE ENOUGH
  43. OR NOT.  ╘HE CASES ARE:
  44.  
  45. . .╪=%00000000 - STRINGS ARE LONG ENOUGH TO BE COMPARED, SO CONTINUE
  46. . .╪=%00000001 - SORTLINE IS TOO SHORT, CMPLINE OK, SO RETURN WITH CARRY CLEAR
  47. . .╪=%00000010 - CMPLINE IS TOO SHORT, SORTLINE OK, SO RETURN WITH CARRY SET
  48. . .╪=%00000011 - BOTH SORTLINE AND CMPLINE ARE TOO SHORT; CARRY SET
  49.  
  50. .%0889!  +  TXA
  51. .%0890!     BEQ DO├OMPARE
  52. .%0891!     CMP #2
  53. .%0892!     RTS
  54. .%0893!
  55. .%0894!     DO├OMPARE = *
  56.  
  57. ╘HIS SECTION DOES THE COMPARE IF BOTH LINES ARE LONG ENOUGH.
  58.  
  59. .%0895!     LDY SORT├OLUMN
  60. .%0896!  -  LDA SORTLINE,Y
  61. .%0897!     CMP CMPLINE,Y
  62. .%0898!     BNE +
  63. .%0899!     CMP #0
  64. .%0900!     BEQ +
  65. .%0901!     INY
  66. .%0902!     BNE -
  67. .%0903!  +  RTS
  68. .%0904!
  69. .%0905!  ;*** POSITION╠INE( SORTLINE ) : SORT╤=PREV, SORT╨=NEXT
  70. .%0906!
  71.  
  72. ╘HIS ROUTINE SEARCHES FOR THE CORRECT POSITION IN THE LINE LIST TO INSERT THE
  73. NEW LINE, AND RETURNS SORT╤ AND SORT╨ TO STRADDLE THE NEW LINE POSITION.  ╬OTE
  74. THAT THIS ROUTINE CAUSES THE LIST TO BE IN REVERSE ORDER AS DISCUSSED
  75. EARLIER.
  76.  
  77. .%0907!  POSITION╠INE = *
  78.  
  79. ╙ET ╨ TO HEAD AND ╤ TO ╬ULL.
  80.  
  81. .%0908!     LDX #2
  82. .%0909!  -  LDA #BK╬ULL
  83. .%0910!     STA SORT╤,X
  84. .%0911!     LDA SORTHEAD,X
  85. .%0912!     STA SORT╨,X
  86. .%0913!     DEX
  87. .%0914!     BPL -
  88. .%0915!
  89. .%0916!     POSITION╙EARCH = *
  90.  
  91. ╘HIS ROUTINE BREAKS OUT IF THE CURRENT LINE POINTER IS ╬ULL.  ╧THERWISE, IT
  92. FETCHES THE CURRENT LINE POINTER (SORT╨) INTO THE CMPLINE BUFFER AND CALLS THE
  93. STRING COMPARE ROUTINE.  ╔F THE NEW LINE READ IN FROM THE FILE IS GREATER THAN
  94. OR EQUAL TO THE CURRENT LINE ALREADY IN THE LIST, THE SEARCH KICKS OUT.  ╘HE
  95. "BCS" ON LINE 924 CONTROLS THE ORDER OF THE SORT.  ╧THERWISE, THE ╨ AND ╤
  96. POINTERS ARE UPDATED IN THE USUAL WAY AND THE SEARCH CONTINUES.
  97.  
  98. .%0917!     LDA SORT╨+2
  99. .%0918!     CMP #BK╬ULL
  100. .%0919!     BEQ POSITION┼XIT
  101. .%0920!     LDA #<CMPBUF
  102. .%0921!     LDY #>CMPBUF
  103. .%0922!     JSR FETCHLINE
  104. .%0923!     JSR SORT╟╘CMP
  105. .%0924!     BCS POSITION┼XIT    ;** CONTROLS SORT ORDER
  106. .%0925!     LDX #2
  107. .%0926!  -  LDA SORT╨,X
  108. .%0927!     STA SORT╤,X
  109. .%0928!     LDA CMPBUF,X
  110. .%0929!     STA SORT╨,X
  111. .%0930!     DEX
  112. .%0931!     BPL -
  113. .%0932!     BMI POSITION╙EARCH
  114. .%0933!
  115. .%0934!     POSITION┼XIT = *
  116.  
  117. ┴T THIS POINT, SORT╨ AND SORT╤ STRADDLE THE POSITION TO PUT THE NEW LINE, SO
  118. WE RETURN.
  119.  
  120. .%0935!     RTS
  121. .%0936!
  122. .%0937!  ;*** STORELINE( SORTLINE )    █BETWEEN SORT╤ AND SORT╨▌
  123. .%0938!
  124.  
  125. ╘HIS ROUTINE ACTUALLY STORES THE NEW LINE READ IN BETWEEN THE SORT╤ AND SORT╨
  126. LINES.
  127.  
  128. .%0939!  STORELINE = *
  129.  
  130. ╞IRST, SPACE FOR THE NEW LINE IS ALLOCATED.
  131.  
  132. .%0940!     LDA SORTBUFLEN
  133. .%0941!     LDY #0
  134. .%0942!     JSR MALLOC
  135. .%0943!     BCC +
  136. .%0944!     RTS
  137.  
  138. ┴ND THE NEW LINE'S NEXT POINTER IS SET TO POINT TO SORT╨.
  139.  
  140. .%0945!  +  LDX #2
  141. .%0946!  -  LDA SORT╨,X
  142. .%0947!     STA SORTBUF,X
  143. .%0948!     DEX
  144. .%0949!     BPL -
  145.  
  146. ┴ND THE NEW LINE IS STASHED OUT TO MAIN MEMORY.
  147.  
  148. .%0950!     LDA #<SORTBUF
  149. .%0951!     LDY #>SORTBUF
  150. .%0952!     STA ZW1
  151. .%0953!     STY ZW1+1
  152. .%0954!     LDA SORTBUFLEN
  153. .%0955!     LDY #0
  154. .%0956!     JSR STASH
  155.  
  156. ╬OW ALL THAT IS LEFT TO IS MAKE THE PREVIOUS LINE RECORD (SORT╤) POINT TO THE
  157. NEW LINE RECORD.
  158.  
  159. .%0957!     LDA SORT╤+2
  160. .%0958!     CMP #BK╬ULL
  161. .%0959!     BEQ STORELINE╞IRST
  162.  
  163. ╔F THERE IS AN ACTUAL PREVIOUS LINE, THE NEW LINE POINTER IS WRITTEN OUT OVER
  164. THE NEXT LINE POINTER IN ITS HEADER.
  165.  
  166. .%0960!     LDX #2
  167. .%0961!  -  LDA ZP1,X
  168. .%0962!     LDY SORT╤,X
  169. .%0963!     STA SORT╤,X
  170. .%0964!     STY ZP1,X
  171. .%0965!     DEX
  172. .%0966!     BPL -
  173. .%0967!     LDX #SORT╤
  174. .%0968!     LDY #3
  175. .%0969!     JSR ZPSTORE
  176. .%0970!     CLC
  177. .%0971!     RTS
  178. .%0972!
  179.  
  180. ╔F THERE IS NO ACTUAL PREVIOUS LINE, THEN THE LINE LIST HEAD POINTER IS SET TO
  181. POINT TO THE NEW LINE (WHICH IS NOW THE FIRST LINE ON THE LIST).
  182.  
  183. .%0973!     STORELINE╞IRST = *
  184. .%0974!     LDX #2
  185. .%0975!  -  LDA ZP1,X
  186. .%0976!     STA SORTHEAD,X
  187. .%0977!     DEX
  188. .%0978!     BPL -
  189. .%0979!     CLC
  190. .%0980!     RTS
  191. .%0981!
  192. .%0982!  ;*** READFILE()
  193. .%0983!
  194.  
  195. ╘HIS ROUTINE READS IN THE FILE AND PUTS THE LINES INTO THEIR CORRECT SORTED
  196. POSITIONS AS IT IS READING.
  197.  
  198. .%0984!  READFILE = *
  199.  
  200. ├LEAR THE LINE LIST BY SETTING THE HEAD POINTER TO ╬ULL.
  201.  
  202. .%0985!     LDX #2
  203. .%0986!     LDA #BK╬ULL
  204. .%0987!  -  STA SORTHEAD,X
  205. .%0988!     DEX
  206. .%0989!     BPL -
  207.  
  208. ╙ET THE ┼╧╞ FLAG TO 0 AND SET THE CURRENT INPUT CHANNEL TO LOGICAL FILE #1
  209. WHICH IS ASSUMED TO BE OPENED BEFORE THE SORT UTILITY IS INVOKED.
  210.  
  211. .%0990!     LDA #0
  212. .%0991!     STA EOFSTAT
  213. .%0992!     LDX #1
  214. .%0993!     JSR KERNEL├HKIN
  215. .%0994!     BCS READ┼XIT
  216.  
  217. ╒NTIL ┼╧╞, READ THE NEW LINE, FIND THE POSITION IN THE LINE LIST, STORE IT,
  218. PRINT OUT A "." TO INDICATE TO THE USER THAT ANOTHER LINE HAS BEEN PROCESSED,
  219. AND REPEAT.  ┼XIT ON ┼╧╞.
  220.  
  221. .%0995!  -  JSR GETLINE
  222. .%0996!     BCS READ┼XIT
  223. .%0997!     JSR POSITION╠INE
  224. .%0998!     JSR STORELINE
  225. .%0999!     BCS READ┼XIT
  226. .%1000!     LDA #"."
  227. .%1001!     JSR ECHO╙TATUS
  228. .%1002!     JMP -
  229. .%1003!
  230. .%1004!     READ┼XIT = *
  231. .%1005!     RTS
  232. .%1006!
  233. .%1007!  ;*** WRITEFILE()
  234. .%1008!
  235.  
  236. ╘HIS ROUTINE WRITES THE LINE LIST OUT TO LOGICAL FILE NUMBER 2 WHICH IS
  237. ASSUMED TO BE OPENED BEFORE THE SORT UTILITY IS INVOKED.  ╘HIS ROUTINE FOLLOWS
  238. THE STANDARD STRUCTURE FOR PROCESSING A LINKED LIST.
  239.  
  240. .%1009!  WRITEFILE = *
  241. .%1010!     LDX #2
  242. .%1011!  -  LDA SORTHEAD,X
  243. .%1012!     STA SORT╨,X
  244. .%1013!     DEX
  245. .%1014!     BPL -
  246. .%1015!     LDX #2
  247. .%1016!     JSR KERNEL├HKOUT
  248. .%1017!
  249. .%1018!     WRITE╠INE = *
  250. .%1019!     LDA SORT╨+2
  251. .%1020!     CMP #BK╬ULL
  252. .%1021!     BEQ WRITE┼XIT
  253. .%1022!     LDA #<SORTBUF
  254. .%1023!     LDY #>SORTBUF
  255. .%1024!     JSR FETCHLINE
  256. .%1025!     JSR PUTLINE
  257. .%1026!     LDX #2
  258. .%1027!  -  LDA SORTBUF,X
  259. .%1028!     STA SORT╨,X
  260. .%1029!     DEX
  261. .%1030!     BPL -
  262. .%1031!     JMP WRITE╠INE
  263. .%1032!
  264. .%1033!     WRITE┼XIT = *
  265. .%1034!     JSR KERNEL├LRCHN
  266. .%1035!     RTS
  267. .%1036!
  268. .%1037!  ;*** REVERSE╠IST()
  269. .%1038!
  270.  
  271. ╘HIS ROUTINE WILL REVERSE THE ORDER OF THE LINE LIST.  ╙TARTING FROM THE HEAD
  272. LINE, EACH LINE IS EXTRACTED AND IS MADE TO POINT TO THE PREVIOUS LINE
  273. EXTRACTED.  ╬O DATA ACTUALLY HAS TO BE MOVED AROUND; ONLY THE HEADERS OF THE
  274. LINE RECORDS HAVE TO BE CHANGED.
  275.  
  276. .%1039!  REVERSE╞ILE = *
  277. .%1040!     LDX #2
  278. .%1041!  -  LDA SORTHEAD,X
  279. .%1042!     STA ZP1,X
  280. .%1043!     LDA #BK╬ULL
  281. .%1044!     STA SORTHEAD,X
  282. .%1045!     DEX
  283. .%1046!     BPL -
  284. .%1047!
  285. .%1048!     REVERSE╠INE = *
  286. .%1049!     LDA ZP1+2
  287. .%1050!     CMP #BK╬ULL
  288. .%1051!     BEQ REVERSE┼XIT
  289.  
  290. ╞ETCH THE POINTER FROM THE CURRENT LINE INTO SORT╨ AND THEN REPLACE IT WITH
  291. THE VALUE AT SORTHEAD (THE PREVIOUS LINE ALTERED).
  292.  
  293. .%1052!     LDX #SORT╨
  294. .%1053!     LDY #3
  295. .%1054!     JSR ZPLOAD
  296. .%1055!     LDX #SORTHEAD
  297. .%1056!     LDY #3
  298. .%1057!     JSR ZPSTORE
  299.  
  300. ═AKE SORTHEAD POINT TO THE CURRENT LINE, AND THEN GO TO THE NEXT LINE WHOSE
  301. POINTER WAS EXTRACTED FROM THE CURRENT LINE (BEFORE THE CURRENT LINE WAS
  302. CHANGED).
  303.  
  304. .%1058!     LDX #2
  305. .%1059!  -  LDA ZP1,X
  306. .%1060!     STA SORTHEAD,X
  307. .%1061!     LDA SORT╨,X
  308. .%1062!     STA ZP1,X
  309. .%1063!     DEX
  310. .%1064!     BPL -
  311. .%1065!     BMI REVERSE╠INE
  312. .%1066!
  313. .%1067!     REVERSE┼XIT = *
  314. .%1068!     RTS
  315. .%1069!
  316. .%1070!  ;*** FREEFILE()
  317. .%1071!
  318.  
  319. ╘HIS ROUTINE SCANS THROUGH THE LINES IN THE LINE LIST AND DEALLOCATES EACH
  320. LINE RECORD.
  321.  
  322. .%1072!  FREEFILE = *
  323. .%1073!     LDX #2
  324. .%1074!  -  LDA SORTHEAD,X
  325. .%1075!     STA ZP1,X
  326. .%1076!     DEX
  327. .%1077!     BPL -
  328. .%1078!
  329. .%1079!     FREE╠INE = *
  330. .%1080!     LDA ZP1+2
  331. .%1081!     CMP #BK╬ULL
  332. .%1082!     BNE +
  333. .%1083!     RTS
  334. .%1084!  +  LDX #HEADER
  335. .%1085!     LDY #4
  336. .%1086!     JSR ZPLOAD
  337. .%1087!     LDA HEADER+3
  338. .%1088!     LDY #0
  339. .%1089!     JSR FREE
  340. .%1090!     LDX #2
  341. .%1091!  -  LDA HEADER,X
  342. .%1092!     STA ZP1,X
  343. .%1093!     DEX
  344. .%1094!     BPL -
  345. .%1095!     JMP FREE╠INE
  346. .%1096!
  347. .%1097!  ;*** MAIN()
  348. .%1098!
  349.  
  350. ╞INALLY!  ╘HE MAIN ROUTINE SETS THE SORT KEY COLUMN AND CALLS EACH OF THE
  351. SUBROUTINES FOR THE DIFFERENT PHASES OF THE SORT AND PRINTS OUT A LETTER
  352. INDICATING WHAT THE PROGRAM IS CURRENTLY DOING.
  353.  
  354. .%1099!  MAIN = *
  355. .%1100!     CMP #1
  356. .%1101!     BCC +
  357. .%1102!     SBC #1
  358. .%1103!  +  STA SORT├OLUMN
  359. .%1104!     LDA #"S"
  360. .%1105!     JSR ECHO╙TATUS
  361. .%1106!     JSR STARTUP
  362. .%1107!     LDA #"R"
  363. .%1108!     JSR ECHO╙TATUS
  364. .%1109!     JSR READFILE
  365. .%1110!     LDA #"V"
  366. .%1111!     JSR ECHO╙TATUS
  367. .%1112!     JSR REVERSE╞ILE
  368. .%1113!     LDA #"W"
  369. .%1114!     JSR ECHO╙TATUS
  370. .%1115!     JSR WRITEFILE
  371. .%1116!     LDA #"F"
  372. .%1117!     JSR ECHO╙TATUS
  373. .%1118!     JSR FREEFILE
  374. .%1119!     LDA #"X"
  375. .%1120!     JSR ECHO╙TATUS
  376. .%1121!     JSR SHUTDOWN
  377. .%1122!     LDA #13
  378. .%1123!     JSR ECHO╙TATUS
  379.  
  380. ╔T RETURNS WITH .┴ SET TO ZERO IN CASE THE USER CALLS SORT AGAIN AND FORGETS
  381. TO SPECIFY A VALUE FOR THE SORTING COLUMN USING THE ┬┴╙╔├ ╙┘╙ STATEMENT.
  382.  
  383. .%1124!     LDA #0
  384. .%1125!     RTS
  385.  
  386. ------------------------------------------------------------------------------
  387.  
  388. 5. ╞╒╘╒╥┼ ┼╬╚┴╬├┼═┼╬╘╙
  389.  
  390. ╘HIS DYNAMIC MEMORY ALLOCATION PACKAGE DOES NOT SUPPORT EXPANDED INTERNAL
  391. MEMORY (AS SPECIFIED IN ╘WIN ├ITIES-128 ═AGAZINE) OR ╥AM╠INK MEMORY.  ╔ AM
  392. PLANNING TO MODIFY THE MEMORY ALLOCATION IN THE ┌ED-128 PROGRAM TO SUPPORT
  393. BOTH OF THESE KINDS OF MEMORY.  ╘HE EXTRA INTERNAL MEMORY BANKS WOULD BE
  394. ACCESSED IN A SIMILAR MANNER AS ╥┴═1 IS, EXCEPT THAT ╔ WILL NEED TO HAVE SOME
  395. SPECIAL BANK NUMBERS FOR THEM, SINCE THEY CANNOT BE HANDLED IN EXACTLY THE
  396. SAME WAY AS ╥┴═0 AND ╥┴═1.  ╔ WILL ALSO HAVE TO MODIFY THAT OTHER ══╒ REGISTER
  397. IN ORDER TO SELECT WHICH REAL BANKS SHOW UP IN THE ╥┴═2 AND ╥┴═3 POSITONS.
  398.  
  399. ╘HE MEMORY INSIDE A ╥AM╠INK CAN BE ACCESSED IN A SIMILAR WAY TO HOW MEMORY IS
  400. ACCESSED IN AN ╥┼╒.  ╧NE BIG DIFFERENCE IS THAT THE LAYOUT OF THE STORAGE IN A
  401. ╥AM╠INK IS ACTUALLY ORGANIZED.  ┴ ╥AM╠INK (AND A ╥AM─RIVE ╔ ASSUME) CAN HAVE
  402. UP TO 31 PARTITONS OF VARIOUS TYPES.  ╔ AM THINKING THAT TO SNIFF A ╥AM╠INK,
  403. THE PACKAGE WILL CHECK TO SEE IF YOU HAVE A ╥AM╠INK AND WILL THEN CHECK TO SEE
  404. IF YOU HAVE PARTITON NUMBER 31 SET UP AS A "FOREIGN" MODE PARTITION WITH THE
  405. NAME "SWAP".  ╔F SO, THE PACKAGE WILL ASK THE ╥╠-─╧╙ FOR THE START ADDRESS AND
  406. LENGTH OF THE PARTITION AND WILL THEN USE THE ╥AM╠INK MEMORY INSTEAD OF AN
  407. ╥┼╒.  ╘HIS MAKES SENSE SINCE AN ╥┼╒ CAN BE MADE INTO BE PART OF THE ╥AM╠INK
  408. AND SINCE YOU CAN GET A LOT MORE MEMORY IN A ╥AM╠INK THAN ╔ HAVE EVER HEARD OF
  409. IN AN EXPANDED ╥┼╒.  ╔ PERSONALLY HAVE AN 8 ═EG ╥AM╠INK AND ╔ HAVE SET ASIDE A
  410. 1 ═EG PARTITION FOR THE SWAP SPACE.  ╬OW ╔ JUST HAVE TO WRITE THE SOFTWARE TO
  411. USE IT.
  412.  
  413. ╘HESE ADDITIONAL TYPES OF MEMORY CAN BE SEEMLESSLY IMPLEMENTED INTO THIS
  414. PACKAGE AND THE USAGE WILL BE COMPELETELY TRANSPARENT TO THE USER AND TO THE
  415. HIGHER LEVEL ROUTINES.
  416.  
  417. ┴LSO, ALTHOUGH ╔ HAVE NOT ATTEMPTED TO DO THIS, THE CODE PRESENTED HERE COULD
  418. BE PORTED TO THE ├OMMODORE 64.  ╘HE COMMON CODE ROUTINES WOULD BE REMOVED
  419. SINCE THE 64 HAS ONLY ONE INTERNAL BANK, AND INSTEAD OF USING THE ══╒ TO
  420. SELECT ╥┴═0, YOU WOULD STORE INTO THE PROCESSOR ╔/╧ PORT TO SELECT THE BARE
  421. INTERNAL ╥┴═.  (┘OU WOULD ALSO HAVE TO WORRY ABOUT INTERRUPTS HAPPENING WHILE
  422. YOU ARE ACCESSING THIS MEMORY).  ┴LL OF THE HIGHER LEVEL CODE ABOVE THE
  423. ZPLOAD, ZPSTORE, FETCH AND STASH ROUTINES WOULD (PROBABLY) STAY (PRETTY MUCH)
  424. THE SAME, SINCE THEY CALL THE LOWER LEVEL ROUTINES TO DO THE ACTUAL
  425. MACHINE-SPECIFIC GRUNT WORK.
  426.  
  427. ╔F YOU HAVE ANY QUESTIONS OR COMMENTS ABOUT THIS ARTICLE, FEEL FREE TO DROP ME
  428. A LINE.
  429.  
  430. ------------------------------------------------------------------------------
  431.  
  432. 6. ╒╒┼╬├╧─┼─ ┬╔╬┴╥╔┼╙
  433.  
  434. ╚ERE ARE THE ┬┴╙╔├ PROGRAM AND THE MACHINE LANGUAGE SUBROUTINES FOR THE
  435. SORTING UTILITY.  ╘HEY ARE IN UUENCODED FORM AND YOU WILL PROBABLY HAVE TO
  436. EXTRACT THEM INTO A SEPARATE FILES BEFORE YOU UUDECODE THEM.  ┼NJOY!
  437.  
  438. BEGIN 640 SORT ═└1╨╞'└$└222╥(─┼.4%541─┼,12┘46%0┬(#╚@242╥."└┌(%-&╠├$└11╨"└$\─
  439. ═╠┬)/5510551&24╤%+┼185"(@.┬!/1+(╪└$╠<└╨└┌└&8<9└"9(─╤/041)3─<@
  440. ═4╘]25"┘"24╪╬+┬╪┬└'└<;@#^└┬└╤-0"'''@└_┴$┬4╘]25"┘"24╪┬+%4╚240╔
  441. ═└*4<@@"9(┼-#4─%40╘┴)3─<@3╘╤$($9)3$4╬+┬╪┬└+4<├└#╥*$\─*2╤5*$]$
  442. ═*0#'')8└╞2)33╒)424┘'+┬╪╬(@#;'*└└╟╙$╠240╠,┬╨┬,#╚┬╩───└/8<╩@"?
  443. ═,┬╤/1"╨╙+"(╨.┬*╩3╥2╩(┬╤3+%<┬└└─=═└">(-$╚(├$╙,#└┬*2╤31@└0';╪└
  444. =╚#(└%╤╫(└*└╤└"@=╘@"9(─9)3─┼32$5$(2(└└└└╚ └ END
  445.  
  446. BEGIN 640 SORT.BIN
  447. ═└!-,╔!┼,(╤-,-┴-,╥!-,_┴-,#11,;11,└╤9,╥18└└└└└└└└└└*─└2"┬╔#╚╘└
  448. ═_╥!($╥#\%""╟%6"┬└*─└╟0└"┌.!╥╘/┬╔└(╘└_╓"┬└+╒6$┘╘└└╬├@<╔#╒8*7\
  449. ═├0#_┴/╓@└+'┌┼0#╚╥,3]─/:╔#╚╘└_╓"┼_(╘└_╪3]╚└"╒└)'┌┌,├$_9#╓╩0┌-
  450. ═└/]@┬/└-├0+_╠?╩-└?^1_╚├0\╪╘"_['┌├0'_─?┌╔#╚╘└_╓"(\└╓-└?^╤_╚╘"
  451. ═_┘'┌┬-#╙├0'_╠?┌-└╧^1^╩─.├0#_8*7\,└-,└└*,!]^@─8╘&╫╪╪"╫┌╘'╒8╘#
  452. ═╫┌7┌├03?╔?╬-!=^╔└(╘(╫┌╘╨╘*(└├├#0├└'?├3#08*7\,└-,&0*,!]^@─$╙4
  453. ═$┌;\$└6┬─4╙-%,└└╘"*╚╘└%@╪#_╨└╘╨╥└╚╪└_╪├╨!['┌─?┌(╘/╞╤^╔'^╩0┌-
  454. ═└/]@┴8"$@:7[┴8*┼_╪6#╔8'╨#┌;\╚└└@'┴3╞^^;_╤╚'0\:2└\└6╞_"└>%*6"
  455. ═┴?╬┼@╪7_8*;\$└6┬─$╙-%,└└╘"*╚╘└%@╪#_╨└╘╤2└╚╪└_╪├╨!['^─?╩(╘/╞╤
  456. ═_╔'┌╩0┌-└/]@┴8"$@:7_┴8*┼^╪6#╔8'╨#┌;\╚└└@?┴3╞^^;_╤╚'0\:2└\└6╞
  457. ═_"!^%*6"┴?^┼@╪7[8(╘'╫╪╨(╫┌7^╔/^-└═^,└]^┼^╩3[├03?├└7?╔?╥-!═^╠
  458. ═,-"╔└(╘╨╘(╪!╫╪╨╨╘&!_╩3^-└/^┬"╦╘└╫┘╘└"\╚0]┌─.├0#_╩0"-"=^-"═^═
  459. ═└-^┬└╦╓┴%96└╥┴#╪╩0"-'!.╔└**└┴?╩%^╪;\(%╨5╠└?╬'!/╞_-#╘╦1╨3╘!6╔
  460. ═/╪╘└_┌(*╧0└+╟0#?╥┴#╫╩0┌-└/]@╦1╨3╙?╠4─└%@╔?╥%@┌*└╚└0@#!,@┴16╨
  461. ═#┌7\2*╞└┴?╥%@╥"%%6┬%_&"╔└(6$┴8>┬┴*└$(└─3╚@.╒┴-6└╘└7*$/<88#┴@
  462. ═4╠┼$0└3[╚@*╔└)╘@$┌╟_╟1╘3╥┴#╙.*╘2$╧└!&*╘3$╬╓─%:┬═╔!6┬/╥#╪%:╓┼
  463. ═%:╥╞%:)_(/@5╩0"%├┌6/╙1╨3╠!4)@(7\╩0"%^╚7[╩?┬@_╥└8$^:/╘.1@┴?╬&
  464. ═_*─└┴?╔,&!,8:0>0└<@╔^(6%┴(:┬└╦╘=$┘7┌╩?^5┴\╚0]*7\╥?_0#┌╟_┴?╩%
  465. ═^╪7\╩0&-&╤,╪8**└╚└4@"1.┼@\6%╔83┼┴╦└0╚@*╒^╔6'═8"5^╠╚0]4╨=%├┬═
  466. ═(!/┼┴8╘@$┌╘┴$^6&├2$3╠└/.(┴.┼@\6%╘└:┼┴.6&\",╪╔8/┼┴86#╔83┼┴╚6$
  467. ═╚╚"@!2└,$╤┬┼^╞6#┴?╩┼^╓6$┴?╠88*6)╥?_0#*("═8"='1/*$/@88*("═?╩╘
  468. ═┴┘6'┼/╦*$/6┬@*└#(└╨3╚@*╒┴┘7┌╥┴#┘&&└8:0>0└<@╔^(6%┴(:┬└╦7┌┼8>]
  469. ═'1.5^╩╟_┼8╦*$/"┼_,╟_\"┬┼_,6)─"+0"╩7┌╤8>┼^^6(╠!:┬@*└#(└─3╚@*╒
  470. ═^╔6*═8"5^╠╚0]3#2╚@*╒┬╔7┌╥┴#┘╔?╙)_]└:╚@*]'1.5@+6'╟1╘3╥┴#╙╔86─
  471. ═┴╚6#┴(1,┴!>┬@*└%(└─3╔?╙%┬=└╩&*7┌98.╩╔?═┼┴,6(╘!╙─┴]└8&*6#986%
  472. ═@┌6$98:%┴*("═8╩5┴\╚0^3└/╚╚>@└╥└,$┌6%╔(:%@╪2$╔8╟%@═└╙&*6'98.╩
  473. ═╔8┴┼┴,6!╘"7─@-└┴╚@*╒@)7┌╥┴#┘╔81(╔8-(╚╚"@!2└)$╤┴╚98.%@╓┴┼┴(6$
  474. ═╚@*╒┴┘7┌╥┴#┘╚╚"@!2└,$╤┬═(!-┼┴8╘@$┌╘┴$╓6&├2$3─└/╬(┴,88*└└)└)╨
  475. ═)"#/_[└?╞00+╥*:0┴@+└\+└%╥0╫0┘╪┬╔└)─$"╤┬8:06-└╨╠88*┼└┴0+└└-#╩
  476. ═.&"@└+─$"_└&(-+_╥-#╒╩0╒,╘╧^%_╚3_╚@*╒!╔7┌╥┴#┘╚@╥@!"└)$┌4/╚└!,
  477. ═#╤.┬└!┬═_╨┴╔!<╘#"┘└!┌,╘#")└"┌.┬*\└/)└╞"╠_╨┬┘!└╧9!└├0!\─└\└/(
  478. ═╘/%@╚@*╔_┘4)═0.5!╠╚0]:4(╥?_╨'*─└╚└@@*╤@@1┴┬╨$*("═0:5";╘└")4&
  479. ═╥┴#╘,-┘@╦0,+╚└└@%1.0└6"┬└╦4&╟0└+╥┴#╪╩0"@"╪7^┴/^═└╨╬@└"└2$┌4+
  480. ═╥?_╨%╩("═?╩╘"94)┼/╦*$/6┬":└#(└╨3&&"┬└╦7┌┼0/*$/─88*("╩?^5└\╚0
  481. ═^┌─└┴0*┬└2#&_[└5(.47╠!└@=!@@╔!┬╨"*─╬(-+_3└098*("═0.5!╠╚0^:("
  482. ═(,╟_╔0├)__└7╩0"@"╥└╦&"└9&*("╧0└+┼0;*$/┴,*!─@╙/]@╚@*╒└┘7┌╩?^5
  483. ═└\╚0]:7\╥?_╨':(&╚└,@"1.┬└┌└#(└╨3╚@*╒^╔4#═0:5^╠╚0]3#=8*("═0.5
  484. ═^╠╚0^:7\╥?_0└6"┬#*└$(└─3╔0^@└"└8$┌("═0╥5^╠╚0^4╥#&<─!─└+╔└8╫_
  485. ═"*┼3(-+_(└,3╩5(@╘╧\@\!┬╔5┬#2_╥!)&:┼7(-+_(!╚9╩48@╘╧\@>┴╞╔6"#2
  486. ,_╥└&$┌─-(-+_╩0!@ └ END
  487.  
  488. ============================================================================
  489. ╬EXT ╔SSUE: (╚OPEFULLY!!! :-] )
  490.  
  491. ╘HE 1351 ═OUSE ─EMYSTIFIED
  492.  
  493.   ┴N INDEPTH LOOK AT HOW THE 1351 MOUSE OPERATES AND HOW TO ACCESS IT WITHIN 
  494. YOUR ═╠ PROGRAMS, IN ADDITION TO A ┬┴╙╔├ DRIVER FOR THE 80 COLUMN SCREEN.
  495.  
  496. ═╠ ╘UTOR - ╨ART 3
  497.  
  498.   ╔N THIS EDITION WE TAKE A LOOK AT READING AND WRITING COMMANDS TO THE DISK
  499. DRIVE, INCLUDING READING THE DISK DIRECTORY.  ╘HIS ARTICLE WILL ALSO PARALLEL
  500. THE DISCUSSION OF THE ├=128 AND ├=64 ╦┼╥╬┴╠ JUMP TABLES OF AVAILABLE ROUTINES.
  501.  
  502. ╦┼╥╬┴╠ 64/128 
  503.  
  504.   ╘HE ├=128 AND ├=64 JUMP TABLE THAT POINTS TO MANY VALUABLE SYSTEM ROUTINES IS
  505. LISTED AND DISCUSSED WITH EXAMPLE APPLICATIONS AND HOW TO USE THEM.
  506.  
  507. ┬URSTING YOUR 128
  508.  
  509.   ╘HIS ARTICLE WILL EXAMINE THE ROUTINES AND MYSTERIES ABOUT HOW TO USE ┬URST
  510. COMMANDS ON THE 1571 AND 1581.  ╘HESE ROUTINES WILL BE EXTRACT FROM ┌ED-128.
  511. ============================================================================
  512. ┼╬─ OF ├= ╚ACKING ╔SSUE 2.
  513. ============================================================================
  514.  
  515.